package com.wpw.spring4.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import com.wpw.spring4.test.assemble.PackageScan;
import com.wpw.spring4.test.assemble.Phone;
/**
 * @Configuration 注解表明这个类是一个配置类，该类应该包含在Spring应用上下文中如何创建bean的细节。
 * 
 * @ComponentScan 注解能够在spring中启用组件扫描，如果没有其他配置的话，默认会扫描与配置类相同的包，
 * Spring将会扫描这个包以及这个包下的所有子包，查找带有@Component注解的类。
 * 如果我们想要将配置类放在单独的包中，使其与其他应用代码分开，需要配置@ComponentScan的属性
 * 	1.value：知道包的名称。
 * 	2.basePackages：指定多个包的名称，以逗号分隔。例如：basePackages={"com.aa","com.bb"}
 * 	3.basePackageClasses:指定包中包含的类或者接口。例如：basePackageClasses={A.class, B.class}
 */
import com.wpw.spring4.test.assemble.SimCard;
@Configuration
@ComponentScan(basePackageClasses = {PackageScan.class})
public class AssembleConfig {

	/**
	 * 简单的bean
	 * @Bean 注解会告诉Spring这个方法返回一个对象，该对象要注册为Spring应用上下文中的bean
	 * 默认情况下，bean的ID与方法名是一样的
	 */
	@Bean
	public SimCard simCard() {
		return new SimCard();
	}
	
	/**
	 * simCard方法上添加了@Bean注解，Spring将会拦截所有对它的调用，并确保直接返回该方法所创建的bean，而不是每次都对其进行实际调用
	 * 默认情况下，spring中的bean都是单例的
	 */
	@Bean
	public Phone phone() {
		return new Phone(simCard());
	}
	
	/**
	 * 当Spring调用phone2方法创建bean的时候，它会自动装配一个SimCard到配置方法中
	 * 通过这种方式引入其他bean是最佳方式
	 */
	@Bean
	public Phone phone2(SimCard simCard) {
		return new Phone(simCard);
	}
	
}
